Check for the entire kernel range for temporarily cleared PMD entries.
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Thu, 16 Feb 2006 11:30:44 +0000 (11:30 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Thu, 16 Feb 2006 11:30:44 +0000 (11:30 +0000)
From: Jan Beulich <JBeulich@novell.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c

index 40d48bc7b8984b7ccb186dcfec7098c05e8764b9..5465e26d1c87252996a85242388d5fba1d7df062 100644 (file)
@@ -366,12 +366,12 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
         */
        if (unlikely(address >= TASK_SIZE64)) {
                /*
-                * Don't check for the module range here: its PML4
-                * is always initialized because it's shared with the main
-                * kernel text. Only vmalloc may need PML4 syncups.
+                * Must check for the entire kernel range here: with writable
+                * page tables the hypervisor may temporarily clear PMD
+                * entries.
                 */
                if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) &&
-                     ((address >= VMALLOC_START && address < VMALLOC_END))) {
+                   address >= PAGE_OFFSET) {
                        if (vmalloc_fault(address) < 0)
                                goto bad_area_nosemaphore;
                        return;